// WORK IN PROGRESS
// Rewrite of uploadtool in Go

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"path"
)

func main() {
	fmt.Println("Hello World!")

	if len(os.Args) < 2 {
		log.Println("No artifacts provided, giving up.")
		os.Exit(1)
	}

	// Exit immediately if one of the files given as arguments is not there
	// because we don't want to delete the existing release if we don't have
	// the new files that should be uploaded

	for _, a := range os.Args[1:] {
		if _, err := os.Stat(a); os.IsNotExist(err) {
			log.Println(a, "is missing, giving up.")
			os.Exit(1)
		}
	}

	releaseName := "continuous"
	releaseTitle := "Continuous build"
	isPrerelease := true

	// TODO: Port the following logic:
	// The calling script (usually .travis.yml) can set a suffix to be used for
	// the tag and release name. This way it is possible to have a release for
	// the output of the CI/CD pipeline (marked as 'continuous') and also test
	// builds for other branches.
	// If this build was triggered by a tag, call the result a Release
	// if [ ! -z "$UPLOADTOOL_SUFFIX" ] ; then
	//  if [ "$UPLOADTOOL_SUFFIX" = "$TRAVIS_TAG" ] ; then
	//    RELEASE_NAME="$TRAVIS_TAG"
	//    RELEASE_TITLE="Release build ($TRAVIS_TAG)"
	//    is_prerelease="false"
	//  else
	//    RELEASE_NAME="continuous-$UPLOADTOOL_SUFFIX"
	//    RELEASE_TITLE="Continuous build ($UPLOADTOOL_SUFFIX)"
	//    is_prerelease="true"
	//  fi
	// else
	//  # ,, is a bash-ism to convert variable to lower case
	//  case $(tr '[:upper:]' '[:lower:]' <<< "$TRAVIS_TAG") in
	//    "")
	//      # Do not use "latest" as it is reserved by GitHub
	//      RELEASE_NAME="continuous"
	//      RELEASE_TITLE="Continuous build"
	//      is_prerelease="true"
	//      ;;
	//    *-alpha*|*-beta*|*-rc*)
	//      RELEASE_NAME="$TRAVIS_TAG"
	//      RELEASE_TITLE="Pre-release build ($TRAVIS_TAG)"
	//      is_prerelease="true"
	//      ;;
	//    *)
	//      RELEASE_NAME="$TRAVIS_TAG"
	//      RELEASE_TITLE="Release build ($TRAVIS_TAG)"
	//      is_prerelease="false"
	//      ;;
	//  esac
	// fi

	// TODO: Port the following logic:
	// if [ "$ARTIFACTORY_BASE_URL" != "" ]; then
	//  echo "ARTIFACTORY_BASE_URL set, trying to upload to artifactory"
	//  if [ "$ARTIFACTORY_API_KEY" == "" ]; then
	//    echo "Please set ARTIFACTORY_API_KEY"
	//    exit 1
	//  fi
	//  files="$@"
	//  # artifactory doesn't support any kind of "artifact description", so we're uploading a text file containing the
	//  # relevant details along with the other artifacts
	//  tempdir=$(mktemp -d)
	//  info_file="$tempdir"/build-info.txt
	//  echo "Travis CI build log: ${TRAVIS_BUILD_WEB_URL}" > "$info_file"
	//  files+=("$info_file")
	//  set +x
	//  for file in ${files[@]}; do
	//    url="${ARTIFACTORY_BASE_URL}/travis-${TRAVIS_BUILD_NUMBER}/"$(basename "$file")
	//    md5sum=$(md5sum "$file" | cut -d' ' -f1)
	//    sha1sum=$(sha1sum "$file" | cut -d' ' -f1)
	//    sha256sum=$(sha256sum "$file" | cut -d' ' -f1)
	//    echo "Uploading $file to $url"
	//    hashsums=(-H "X-Checksum-Md5:$md5sum")
	//    hashsums+=(-H "X-Checksum-Sha1:$sha1sum")
	//    hashsums+=(-H "X-Checksum-Sha256:$sha256sum")
	//    if ! curl -H 'X-JFrog-Art-Api:'"$ARTIFACTORY_API_KEY" "${hashsums[@]}" -T "$file" "$url"; then
	//      echo "Failed to upload file, exiting"
	//      rm -r "$tempdir"
	//      exit 1
	//    fi
	//    echo
	//    echo "MD5 checksum: $md5sum"
	//    echo "SHA1 checksum: $sha1sum"
	//    echo "SHA256 checksum: $sha256sum"
	//  done
	//  rm -r "$tempdir"
	// fi

	// Do not upload non-master branch builds
	// # if [ "$TRAVIS_TAG" != "$TRAVIS_BRANCH" ] && [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi

	if (os.Getenv("TRAVIS_TAG") != os.Getenv("TRAVIS_BRANCH")) && os.Getenv("TRAVIS_BRANCH") != "master" {
		os.Setenv("TRAVIS_EVENT_TYPE", "pull_request")
	}

	// if [ "$TRAVIS_EVENT_TYPE" == "pull_request" ] ; then
	//  echo "Release uploading disabled for pull requests"
	//  if [ "$ARTIFACTORY_BASE_URL" != "" ]; then
	//    echo "Releases have already been uploaded to Artifactory, exiting"
	//    exit 0
	//  else
	//    echo "Release uploading disabled for pull requests, uploading to transfer.sh instead"
	//    rm -f ./uploaded-to
	//    for FILE in "$@" ; do
	//      BASENAME="$(basename "${FILE}")"
	//      curl --upload-file $FILE "https://transfer.sh/$BASENAME" > ./one-upload
	//      echo "$(cat ./one-upload)" # this way we get a newline
	//      echo -n "$(cat ./one-upload)\\n" >> ./uploaded-to # this way we get a \n but no newline
	//    done
	//  fi

	if os.Getenv("TRAVIS_EVENT_TYPE") != "pull_request" {
		log.Println("Release uploading disabled for pull requests")
		if os.Getenv("ARTIFACTORY_BASE_URL") != "" {
			log.Println("Releases have already been uploaded to Artifactory, exiting")
			os.Exit(0)
		} else {
			log.Println("Release uploading disabled for pull requests, uploading to transfer.sh instead")
			for _, a := range os.Args[1:] {
				resp, err := http.Get("https://transfer.sh/" + path.Base(a))
				if err != nil {
					log.Println("Could not upload to transfer.sh:", err)
					os.Exit(1)
				}
				defer resp.Body.Close()

			}
		}
	}

	if os.Getenv("TRAVIS_REPO_SLUG") != "" {

		// We are running on Travis CI
		log.Println("Running on Travis CI")
		log.Println("TRAVIS_COMMIT:", os.Getenv("TRAVIS_COMMIT"))

		if os.Getenv("TRAVIS_REPO_SLUG") == "" {
			log.Println("$GITHUB_TOKEN missing, please set it in the Travis CI settings of this project")
			log.Println("You can get one from https://github.com/settings/tokens")
			os.Exit(1)
		}
	}

	// TODO: Port the following logic:
	// else
	//  # We are not running on Travis CI
	//  echo "Not running on Travis CI"
	//  if [ -z "$REPO_SLUG" ] ; then
	//    read -r -p "Repo Slug (GitHub and Travis CI username/reponame): " REPO_SLUG
	//  fi
	//  if [ -z "$GITHUB_TOKEN" ] ; then
	//    read -r -s -p "Token (https://github.com/settings/tokens): " GITHUB_TOKEN
	//  fi
	// fi

	// tag_url="https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME"
	// tag_infos=$(curl -XGET --header "Authorization: token ${GITHUB_TOKEN}" "${tag_url}")

	req, err := http.NewRequest("GET", os.ExpandEnv("https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME"), nil)
	if err != nil {
		log.Println("Could not construct request to https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME:", err)
		os.Exit(1)
	}
	req.Header.Set("Authorization", os.ExpandEnv("token ${GITHUB_TOKEN}"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Println("Could not execute request to https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME:", err)
		os.Exit(1)
	}
	defer resp.Body.Close()

	log.Println("tag_infos:", resp.Body)

	// tag_sha=$(echo "$tag_infos" | grep '"sha":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1)
	// echo "tag_sha: $tag_sha"

	// release_url="https://api.github.com/repos/$REPO_SLUG/releases/tags/$RELEASE_NAME"
	// echo "Getting the release ID..."
	// echo "release_url: $release_url"
	// release_infos=$(curl -XGET --header "Authorization: token ${GITHUB_TOKEN}" "${release_url}")
	// echo "release_infos: $release_infos"
	// release_id=$(echo "$release_infos" | grep "\"id\":" | head -n 1 | tr -s " " | cut -f 3 -d" " | cut -f 1 -d ",")
	// echo "release ID: $release_id"
	// upload_url=$(echo "$release_infos" | grep '"upload_url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1)
	// echo "upload_url: $upload_url"
	// release_url=$(echo "$release_infos" | grep '"url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1)
	// echo "release_url: $release_url"
	// target_commit_sha=$(echo "$release_infos" | grep '"target_commitish":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1)
	// echo "target_commit_sha: $target_commit_sha"

	// if [ "$TRAVIS_COMMIT" != "$target_commit_sha" ] ; then

	//  echo "TRAVIS_COMMIT != target_commit_sha, hence deleting $RELEASE_NAME..."

	//  if [ ! -z "$release_id" ]; then
	//    delete_url="https://api.github.com/repos/$REPO_SLUG/releases/$release_id"
	//    echo "Delete the release..."
	//    echo "delete_url: $delete_url"
	//    curl -XDELETE \
	//        --header "Authorization: token ${GITHUB_TOKEN}" \
	//        "${delete_url}"
	//  fi

	//  # echo "Checking if release with the same name is still there..."
	//  # echo "release_url: $release_url"
	//  # curl -XGET --header "Authorization: token ${GITHUB_TOKEN}" \
	//  #     "$release_url"

	//  if [ "$RELEASE_NAME" == "continuous" ] ; then
	//    # if this is a continuous build tag, then delete the old tag
	//    # in preparation for the new release
	//    echo "Delete the tag..."
	//    delete_url="https://api.github.com/repos/$REPO_SLUG/git/refs/tags/$RELEASE_NAME"
	//    echo "delete_url: $delete_url"
	//    curl -XDELETE \
	//        --header "Authorization: token ${GITHUB_TOKEN}" \
	//        "${delete_url}"
	//  fi

	//  echo "Create release..."

	//  if [ -z "$TRAVIS_BRANCH" ] ; then
	//    TRAVIS_BRANCH="master"
	//  fi

	//  if [ ! -z "$TRAVIS_JOB_ID" ] ; then
	//    if [ -z "${UPLOADTOOL_BODY+x}" ] ; then
	//      BODY="Travis CI build log: ${TRAVIS_BUILD_WEB_URL}"
	//    else
	//      BODY="$UPLOADTOOL_BODY"
	//    fi
	//  else
	//    BODY="$UPLOADTOOL_BODY"
	//  fi

	//  release_infos=$(curl -H "Authorization: token ${GITHUB_TOKEN}" \
	//       --data '{"tag_name": "'"$RELEASE_NAME"'","target_commitish": "'"$TRAVIS_COMMIT"'","name": "'"$RELEASE_TITLE"'","body": "'"$BODY"'","draft": false,"prerelease": '$is_prerelease'}' "https://api.github.com/repos/$REPO_SLUG/releases")

	//  echo "$release_infos"

	//  unset upload_url
	//  upload_url=$(echo "$release_infos" | grep '"upload_url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1)
	//  echo "upload_url: $upload_url"

	//  unset release_url
	//  release_url=$(echo "$release_infos" | grep '"url":' | head -n 1 | cut -d '"' -f 4 | cut -d '{' -f 1)
	//  echo "release_url: $release_url"

	// fi # if [ "$TRAVIS_COMMIT" != "$tag_sha" ]

	// if [ -z "$release_url" ] ; then
	// echo "Cannot figure out the release URL for $RELEASE_NAME"
	// exit 1
	// fi

	// echo "Upload binaries to the release..."

	// for FILE in "$@" ; do
	//  FULLNAME="${FILE}"
	//  BASENAME="$(basename "${FILE}")"
	//  curl -H "Authorization: token ${GITHUB_TOKEN}" \
	//       -H "Accept: application/vnd.github.manifold-preview" \
	//       -H "Content-Type: application/octet-stream" \
	//       --data-binary @$FULLNAME \
	//       "$upload_url?name=$BASENAME"
	//  echo ""
	// done

	// $shatool "$@"

	// if [ "$TRAVIS_COMMIT" != "$tag_sha" ] ; then
	//  echo "Publish the release..."

	//  release_infos=$(curl -H "Authorization: token ${GITHUB_TOKEN}" \
	//       --data '{"draft": false}' "$release_url")

	//  echo "$release_infos"
	// fi # if [ "$TRAVIS_COMMIT" != "$tag_sha" ]

}
